Divide and Conquer

분할
: 현재의 문제와 동일하되 입력의 크기가 더 작은 다수의 부분 문제로 분할
정복
: 부분 문제를 재귀적으로 풀어서 정복. 부분 문제의 크기가 충분히 작으면 직접적인 방법으로 푼다.
결합
: 부분 문제의 해를 결합해 문제의 해가 되도록 만듬

점화식을 푸는 방법
- 치환법(substitution method)
- 재귀 트리 방법(recursion-tree method)
- 마스터 방법(master method)
Maximum-subarray problem
#include <iostream>
#include <climits>
using namespace std;
struct int3{
int n1, n2, n3;
int3(int _n1, int _n2, int _n3): n1(_n1), n2(_n2), n3(_n3){}
};
int3 find_max_crossing_subarray(int* arr, int low, int mid, int high){
int left_sum=INT_MIN, right_sum=INT_MIN;
int sum=0, max_left, max_right;
for(int i=mid; i>=low; --i){
sum=sum+arr[i];
if(sum>left_sum){
left_sum=sum;
max_left=i;
}
}
sum=0;
for(int j=mid+1; j<=high; ++j){
sum=sum+arr[j];
if(sum>right_sum){
right_sum=sum;
max_right=j;
}
}
return int3(max_left, max_right, left_sum+right_sum);
}
int3 find_maximum_subarray(int* arr, int low, int high){
if(high==low) return int3(low, high, arr[low]);
else {
int mid=(low+high)/2;
int3 l3=find_maximum_subarray(arr, low, mid);
int3 r3=find_maximum_subarray(arr, mid+1, high);
int3 m3=find_max_crossing_subarray(arr, low, mid, high);
if(l3.n3>=r3.n3 && l3.n3>=m3.n3) return l3;
else if(r3.n3>=l3.n3 && r3.n3>>m3.n3) return r3;
else return m3;
}
}
int main(void){
int tot_arr[]={100, 113, 110, 85, 105, 102, 86, 63, 81, 101, 94, 106, 101, 79, 94, 90, 97};
int size=sizeof(tot_arr)/sizeof(int)-1;
int arr[size];
for(int i=0; i<size+1; ++i){
arr[i]=tot_arr[i+1]-tot_arr[i];
}
int3 result=find_maximum_subarray(arr, 0, size-1);
cout<<"from: "<<result.n1<<" to: "<<result.n2<<" sum: "<<result.n3<<endl;
return 0;
}
점화식 푸는 방법
치환(substitution):
1. 해의 모양을 추측한다.
2. 상수의 값을 찾기 위해 수학적 귀납법을 사용하고, 해가 옳음을 보인다.

재귀 트리(Recursion Tree)
트리의 레벨당 비용의 집합을 얻기 위해 트리의 각 레벨마다 비용을 합한 후, 모든 레벨당 비용을 합함

마스터 방법(Master Method)
T(n)=aT(n/b)+f(n)    ; a(>=1), b(>1) 상수, f(n)은 점근적으로 양인 함수

마스터 정리
Master Method a(0)b(>1)가 상수이고 f(n)이 양의 함수라 하고, 음이 아닌 정수에 대해 T(n)이 다음 점화식에 의해 정의된다고 하자 T(n)=aT(n/b)+f(n) 1. 상수 ϵ(>0)에 대해 f(n)=O(nlogbaϵ) 이면, T(n)=Θ(nlogba) 이다. 2. f(n)=Θ(nlogba)이면, T(n)=Θ(nlogbalg(n)) 이다. 3. 상수 ϵ(>0)에 대해 f(n)=Ω(nlogba+ϵ) 이고 상수 c(<1)와 충분히 큰 모든 n에 대해 af(n/b)cf(n)이면, T(n)=Θ(f(n)) 이다.